package com.cskaoyan.javase.array._2memory;

/**
 * 数组的静态初始化
 * 总结:
 *      1.对象中的元素具有默认初始化,该过程不可省略,且永远最先进行.
 *      2.对象中的元素如果存储基本数据类型元素,那么就直接存储它的取值
 *          如果存储引用数据类型元素,存储该引用数据类型变量的引用,该引用指向堆上的另一个对象
 *
 *     引用数据类型变量 = 引用 + 对象
 *     对象始终存储在堆上
 *     但引用根据存储的位置不同,是有不同的用法的
 *     如果该引用数据类型变量定义在方法中,那么引用存储在栈中,是没有默认值的,必须手动初始化
 *     如果该引用数据类型变量存储在对象中,那么对象中存储就是引用,是有默认值的,无需手动初始化就可以使用
 *          (当然这时默认值是null,实际上也是不可用的)
 *          手动赋值后,这些引用可以指向堆上的其它对象
 *
 *
 *
 * @since 15:01
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo3 {
    public static void main(String[] args) {
        // 静态初始化一个长度为2的String类型数组
        // String[] arr = {"abc", "666"};


        /*
            数组是一个引用数据类型变量,这是处在局部位置的数组变量
            它的引用存储在栈中,它没有默认值
            所以如果不手动初始化,该数组变量是不可用的.
          */
        String[] arr2;
        // System.out.println(arr2);

        /*
            对于String类型数组arr3来说
            该数组变量定义在main方法中,是一个局部变量数组
            引用arr3存储在方法栈帧中,没有默认值,所以需要手动初始化才可用
            "="右边就是手动arr3存储在方法栈初始化的过程,new表示在堆上创建对象

            这个String数组对象中,装的是引用数据类型变量String变量,有三个
            存储的是这三个String变量的引用
            并且具有默认值null
            随后可以手动赋值,指向堆上的String对象

         */
        String[] arr3 = new String[3];
        System.out.println(arr3[0]);
        System.out.println(arr3[1]);
        System.out.println(arr3[2]);
        // arr3的String数组对象中的引用指向了堆上的"abc"字符串对象
        arr3[0] = "abc";
    }
}
